package com.muzi;

import com.muzi.command.Command;
import com.muzi.command.StartCommand;
import com.muzi.decorator.GPSDecorator;
import com.muzi.facade.AgricultureSystemFacade;
import com.muzi.factory.*;
import com.muzi.observer.EnvironmentMonitor;
import com.muzi.proxy.AuthorizedAccessProxy;
import com.muzi.responsibility.EmergencyStopHandler;
import com.muzi.responsibility.ObstacleAvoidanceHandler;
import com.muzi.responsibility.SafetyHandler;

public class Main {
    public static void main(String[] args) {
        // 1.工厂方法创建农机
        EquipmentFactory tractorFactory = new TractorFactory(); // 拖拉机工厂
        FarmEquipment tractor = tractorFactory.createEquipment(); // 创建拖拉机

        // 2.装饰器增强功能——添加GPS功能
        GPSDecorator gpsTractor = new GPSDecorator(tractor); // GPS装饰器包装拖拉机

        // 3.代理控制访问权限——使用代理进行控制访问
        AuthorizedAccessProxy accessProxy = new AuthorizedAccessProxy(gpsTractor, true);
        //代理拖拉机，允许访问
        accessProxy.operate(); // 输出：GPS增强 + 拖拉机运行

        // 4.状态模式切换状态
        Seeder seeder = new Seeder();//播种机

        seeder.changeState("working"); // 手动切换到工作状态
        System.out.println("当前状态：" + seeder.getCurrentState());

        seeder.changeState("faulty"); // 手动切换到故障状态
        System.out.println("当前状态：" + seeder.getCurrentState());

        seeder.changeState("idle"); // 手动切换到空闲状态
        System.out.println("当前状态：" + seeder.getCurrentState());


        // 5.命令模式封装指令
        Command startCmd = new StartCommand(accessProxy);//多态
        startCmd.execute(); // 输出：再次运行拖拉机

        // 6.观察者注册并接收通知
        EnvironmentMonitor monitor = new EnvironmentMonitor();
        Seeder seeder1 = new Seeder("播种机");

        monitor.addObserver(seeder1); //  注册种子机观察者

        monitor.detectChange("检测到高湿度"); // 播种机和喷药机都会收到通知


        // 7.策略模式切换策略
        // 土壤湿度为 25%，应使用高效策略
        seeder1.setStrategyByMoistureLevel(25.0);
        seeder1.executeStrategy();

        // 土壤湿度为 50%，应使用平衡策略
        seeder1.setStrategyByMoistureLevel(50);
        seeder1.executeStrategy();

        // 土壤湿度为 85%，应使用危险策略
        seeder1.setStrategyByMoistureLevel(85);
        seeder1.executeStrategy();

        // 8.责任链处理安全事件
        SafetyHandler chain = new ObstacleAvoidanceHandler(); //  创建责任链
        SafetyHandler emergency = new EmergencyStopHandler(); //  创建紧急停车处理器
        chain.setNext(emergency);

        chain.handleEvent("ObstacleDetected"); // 避障
        chain.handleEvent("Emergency"); // 紧急停车

        // 9.外观模式调用系统接口
        AgricultureSystemFacade systemFacade = new AgricultureSystemFacade(); // 创建外观
        systemFacade.startTractor(); // 启动拖拉机
        systemFacade.simulateEnvironmentChange("检测到温度上升"); // 模拟环境变化
    }
}
